package com.itwxz.common.utils;


import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.lionsoul.ip2region.xdb.Searcher;
import org.springframework.core.io.ClassPathResource;

import java.io.File;
import java.io.InputStream;
import java.util.Objects;

/**
 * IP地址区域查询工具类
 * 使用ip2region 2.7.0版本实现IP地址到地理位置的查询
 */
@Slf4j
public class RegionUtil {
    // 系统临时目录属性名
    private static final String JAVA_TEMP_DIR = "java.io.tmpdir";
    // IP查询器实例
    private static Searcher searcher = null;

    // 静态初始化块，加载IP数据库
    static {
        try {
            // 获取数据库文件路径
            String dbPath = Objects.requireNonNull(RegionUtil.class.getResource("/ip2region/ip2region.xdb")).getPath();
            File file = new File(dbPath);
            
            // 如果数据库文件不存在，则从classpath复制到临时目录
            if (!file.exists()) {
                String tmpDir = System.getProperties().getProperty(JAVA_TEMP_DIR);
                dbPath = tmpDir + "ip2region.xdb";
                file = new File(dbPath);
                
                // 从classpath加载数据库文件
                ClassPathResource cpr = new ClassPathResource("ip2region" + File.separator + "ip2region.xdb");
                InputStream resourceAsStream = cpr.getInputStream();
                
                // 将数据库文件复制到临时目录
				FileUtils.copyInputStreamToFile(resourceAsStream, file);
			}
            
            // 2.7.0版本初始化方式：加载数据库内容到内存
            byte[] cBuff = Searcher.loadContentFromFile(dbPath);
            searcher = Searcher.newWithBuffer(cBuff);
            log.info("ip2region searcher initialized successfully");
        } catch (Exception e) {
            log.error("init ip region error", e);
        }
    }

    /**
     * 根据IP地址获取地理位置信息
     * @param ip 要查询的IP地址
     * @return 地理位置信息字符串，格式如：国家|区域|省份|城市|运营商
     *         如果查询失败返回空字符串
     */
    public static String getRegion(String ip) {
        try {
            // 参数校验
            if (searcher == null || StringUtils.isEmpty(ip)) {
                log.error("Searcher is null or ip is empty");
                return StringUtils.EMPTY;
            }
            
            // 记录查询开始时间
            long startTime = System.currentTimeMillis();
            
            // 执行IP查询
            String region = searcher.search(ip);
            
            // 记录查询结束时间
            long endTime = System.currentTimeMillis();
            log.debug("region use time[{}] result[{}]", endTime - startTime, region);
            
            return region;
        } catch (Exception e) {
            log.error("error", e);
        }
        return StringUtils.EMPTY;
    }
}
